import { ref, onMounted, onUnmounted } from 'vue';

/**
 * 菜单触摸优化组合函数
 * 自动检测设备类型，并优化移动端菜单交互行为
 */
export function useMenuTouchOptimization() {
  // 响应式数据
  const isMobileDevice = ref(false);
  const isTouchEventActive = ref(false);
  const lastTouchTimestamp = ref(0);
  const touchTimeout = 200; // 触摸事件与鼠标事件的时间差阈值

  // 检测设备是否为移动设备
  const detectMobileDevice = () => {
    // 使用多种方法检测移动设备
    const isMobile = (
      /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
      ('ontouchstart' in window) ||
      (navigator.maxTouchPoints > 0)
    );

    isMobileDevice.value = isMobile;
    return isMobile;
  };

  // 处理触摸开始事件
  const handleTouchStart = () => {
    isTouchEventActive.value = true;
    lastTouchTimestamp.value = Date.now();
  };

  // 处理触摸结束事件
  const handleTouchEnd = () => {
    // 延迟重置触摸事件状态，以覆盖后续可能触发的鼠标事件
    setTimeout(() => {
      isTouchEventActive.value = false;
    }, touchTimeout);
  };

  // 计算属性：获取实际的菜单触发方式
  const getActualTriggerMode = (configuredMode: string) => {
    // 在移动设备上强制使用click触发
    if (isMobileDevice.value) {
      return 'click';
    }
    return configuredMode;
  };

  // 检查是否应该忽略鼠标事件（当触摸事件刚刚发生时）
  const shouldIgnoreMouseEvent = () => {
    return isTouchEventActive.value ||
      (Date.now() - lastTouchTimestamp.value < touchTimeout);
  };

  // 组件挂载时初始化
  onMounted(() => {
    // 初始检测
    detectMobileDevice();

    // 监听窗口大小变化，重新检测设备类型
    window.addEventListener('resize', detectMobileDevice);

    // 监听触摸事件
    window.addEventListener('touchstart', handleTouchStart, { passive: true });
    window.addEventListener('touchend', handleTouchEnd, { passive: true });
    window.addEventListener('touchcancel', handleTouchEnd, { passive: true });
  });

  // 组件卸载时清理
  onUnmounted(() => {
    window.removeEventListener('resize', detectMobileDevice);
    window.removeEventListener('touchstart', handleTouchStart);
    window.removeEventListener('touchend', handleTouchEnd);
    window.removeEventListener('touchcancel', handleTouchEnd);
  });

  // 返回公共方法和状态
  return {
    isMobileDevice,
    getActualTriggerMode,
    shouldIgnoreMouseEvent
  };
}